package com.atguigu.yygh.hosp.api;

import com.atguigu.yygh.common.exception.YyghException;
import com.atguigu.yygh.common.helper.HttpRequestHelper;
import com.atguigu.yygh.common.result.Result;
import com.atguigu.yygh.common.result.ResultCodeEnum;
import com.atguigu.yygh.hosp.service.DepartmentService;
import com.atguigu.yygh.hosp.service.HospitalService;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import com.atguigu.yygh.hosp.service.ScheduleService;
import com.atguigu.yygh.model.hosp.Department;
import com.atguigu.yygh.model.hosp.Schedule;
import com.atguigu.yygh.order.client.OrderInfoFeignClient;
import com.atguigu.yygh.vo.hosp.DepartmentQueryVo;
import com.atguigu.yygh.vo.hosp.ScheduleQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 *
 * @author qy
 *
 */
@Api(tags = "医院管理API接口")
@RestController
@RequestMapping("/api/hosp")
public class ApiController {

	@Autowired
	private HospitalService hospitalService;

	@Autowired
	private HospitalSetService hospitalSetService;

	@Autowired
	private DepartmentService departmentService;

	@Autowired
	private ScheduleService scheduleService;

	@Autowired
	private OrderInfoFeignClient orderInfoFeignClient;

	@ApiOperation(value = "上传医院")
	@PostMapping("saveHospital")
	public Result saveHospital(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//传输过程中“+”转换为了“ ”，因此我们要转换回来
		String logoDataString = (String)paramMap.get("logoData");
		if(!StringUtils.isEmpty(logoDataString)) {
			String logoData = logoDataString.replaceAll(" ", "+");
			paramMap.put("logoData", logoData);
		}

		//签名校验
//		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
//			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
//		}

		hospitalService.save(paramMap);
		return Result.ok();
	}

	@ApiOperation(value = "获取医院信息")
	@PostMapping("hospital/show")
	public Result hospital(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		return Result.ok(hospitalService.getByHoscode((String)paramMap.get("hoscode")));
	}

	@ApiOperation(value = "上传科室")
	@PostMapping("saveDepartment")
	public Result saveDepartment(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		departmentService.save(paramMap);
		return Result.ok();
	}

	@ApiOperation(value = "获取科室分页列表")
	@PostMapping("department/list")
	public Result department(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		//非必填
		String depcode = (String)paramMap.get("depcode");
		int page = StringUtils.isEmpty(paramMap.get("page")) ? 1 : Integer.parseInt((String)paramMap.get("page"));
		int limit = StringUtils.isEmpty(paramMap.get("limit")) ? 10 : Integer.parseInt((String)paramMap.get("limit"));

		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		DepartmentQueryVo departmentQueryVo = new DepartmentQueryVo();
		departmentQueryVo.setHoscode(hoscode);
		departmentQueryVo.setDepcode(depcode);
		Page<Department> pageModel = departmentService.selectPage(page, limit, departmentQueryVo);
		return Result.ok(pageModel);
	}

	@ApiOperation(value = "删除科室")
	@PostMapping("department/remove")
	public Result removeDepartment(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		//必填
		String depcode = (String)paramMap.get("depcode");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		departmentService.remove(hoscode, depcode);
		return Result.ok();
	}

	@ApiOperation(value = "上传排班")
	@PostMapping("saveSchedule")
	public Result saveSchedule(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		scheduleService.save(paramMap);
		return Result.ok();
	}

	@ApiOperation(value = "获取排班分页列表")
	@PostMapping("schedule/list")
	public Result schedule(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		//非必填
		String depcode = (String)paramMap.get("depcode");
		int page = StringUtils.isEmpty(paramMap.get("page")) ? 1 : Integer.parseInt((String)paramMap.get("page"));
		int limit = StringUtils.isEmpty(paramMap.get("limit")) ? 10 : Integer.parseInt((String)paramMap.get("limit"));

		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		ScheduleQueryVo scheduleQueryVo = new ScheduleQueryVo();
		scheduleQueryVo.setHoscode(hoscode);
		scheduleQueryVo.setDepcode(depcode);
		Page<Schedule> pageModel = scheduleService.selectPage(page , limit, scheduleQueryVo);
		return Result.ok(pageModel);
	}

	@ApiOperation(value = "删除科室")
	@PostMapping("schedule/remove")
	public Result removeSchedule(HttpServletRequest request) {
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		//必填
		String hosScheduleId = (String)paramMap.get("hosScheduleId");
		if(StringUtils.isEmpty(hoscode)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		scheduleService.remove(hoscode, hosScheduleId);
		return Result.ok();
	}

	@ApiOperation(value="确认取号")
	@DeleteMapping("confirmGetNumber")
	public Result batchRemove(HttpServletRequest request){
		Map<String, Object> paramMap = HttpRequestHelper.switchMap(request.getParameterMap());
		//必须参数校验 略
		String hoscode = (String)paramMap.get("hoscode");
		//必填
		String hosRecordId = (String)paramMap.get("hosRecordId");
		if(StringUtils.isEmpty(hoscode) || StringUtils.isEmpty(hosRecordId)) {
			throw new YyghException(ResultCodeEnum.PARAM_ERROR);
		}
		//签名校验
		if(!HttpRequestHelper.isSignEquals(paramMap, hospitalSetService.getSignKey(hoscode))) {
			throw new YyghException(ResultCodeEnum.SIGN_ERROR);
		}

		boolean isConfirm = orderInfoFeignClient.confirmGetNumber(hoscode, hosRecordId);
		if(!isConfirm) {
			Result.fail();
		}
		return Result.ok();
	}
}

